home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-08-04 | 2.0 KB | 97 lines | [TEXT/PJMM] |
- unit MyGetZoneList;
-
- interface
-
- function MyGetMyZone: str255;
- function MyGetZoneList (datap: ptr; var size: longInt; var count: integer): OSErr;
- function MyGetNextZone (var datap: ptr): str255;
-
- implementation
-
- uses
- Appletalk;
-
- function MyGetMyZone: str255;
- var
- xpp: XPPParamBlock;
- oe: OSErr;
- s: str255;
- begin
- xpp.zipInfoField[1] := 0;
- xpp.zipInfoField[2] := 0;
- xpp.xppTimeOut := 4;
- xpp.xppRetry := 2;
- xpp.zipBuffPtr := @s;
- xpp.ioRefNum := XPPRefNum; { driver refNum -41 }
- xpp.csCode := xCall;
- xpp.xppSubCode := zipGetMyZone;
- oe := PBControlSync(@xpp);
- if oe <> noErr then
- s := '*';
- MyGetMyZone := s;
- end;
-
- procedure ClearBlock (cb: ptr; size: longInt);
- var
- p: longint;
- begin
- for p := longInt(cb) to longInt(cb) + size - 1 do
- ptr(p)^ := -27;
- end;
-
- function MyGetZoneList (datap: ptr; var size: longInt; var count: integer): OSErr;
- var
- xpp: XPPParamBlock;
- oe: OSErr;
- i: integer;
- p: ptr;
- buffer: packed array[1..578] of byte;
- b: integer;
- len: integer;
- begin
- ClearBlock(@xpp, sizeof(xpp));
- xpp.ioRefNum := XPPRefNum; { driver refNum -41 }
- xpp.csCode := xCall;
- xpp.xppSubCode := zipGetZoneList;
- xpp.xppTimeout := 4;
- xpp.xppRetry := 2;
- xpp.zipBuffPtr := @buffer;
- xpp.zipInfoField[1] := 0;
- xpp.zipInfoField[2] := 0;
- count := 0;
- p := datap;
- repeat
- oe := PBControlSync(@xpp);
- if oe = noErr then begin
- b := 1;
- for i := 1 to xpp.zipNumZones do begin
- len := buffer[b] + 1;
- if size - (ord(p) + len - ord(datap)) > 0 then begin
- BlockMove(@buffer[b], p, len);
- p := ptr(ord(p) + len);
- end;
- b := b + len;
- end;
- end;
- count := count + xpp.zipNumZones;
- until (oe <> noErr) or (xpp.zipLastFlag <> 0);
- size := ord(p) - ord(datap);
- if oe <> noErr then begin
- size := 0;
- count := 0;
- end;
- MyGetZoneList := oe;
- end;
-
- function MyGetNextZone (var datap: ptr): str255;
- var
- s: str255;
- len: integer;
- begin
- len := BAND(datap^, $FF);
- BlockMove(datap, @s, len + 1);
- datap := ptr(ord(datap) + len + 1);
- MyGetNextZone := s;
- end;
-
- end.